package DAO;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import com.mysql.jdbc.CallableStatement;
import com.mysql.jdbc.PreparedStatement;

import Model.Cid;
import Model.Usuario;
import Utils.Conexao;

public class UsuarioDAO {

	public static void Insert(Usuario user) throws SQLException
	{
		Connection con = Conexao.getConection();		
		String mysqlCall = "call spc_insert_usuario(?, ?, ?, ?, ?)";			
		CallableStatement call = UsuarioDAO.setObjectCallableStatement(user, mysqlCall, con);		
		call.execute();

		call.close();		
		con.close();		
	}
	
	public static void Update(Usuario user) throws SQLException
	{		
		Connection con = Conexao.getConection();		
		String mysqlCall = "call spc_update_usuario(?, ?, ?, ?, ?, ?)";			
		CallableStatement call = UsuarioDAO.setObjectCallableStatement(user, mysqlCall, con);		
		call.execute();

		call.close();		
		con.close();		
	}
	
	public static void InativarUsuario(int id) throws SQLException
	{
		Connection con = Conexao.getConection();
		String mysqlCall = "call spc_inativar_usuario(?)";		
		CallableStatement call = (CallableStatement) con.prepareCall(mysqlCall);
		call.setInt(1, id);
		call.execute();

		call.close();
		con.close();
	}
	
	public static void AlterarSenha(String senha, int idUsuario) throws SQLException
	{
		Connection con = Conexao.getConection();
		String mysqlCall = "call spc_atualizar_senha_usuario(?, ?)";		
		CallableStatement call = (CallableStatement) con.prepareCall(mysqlCall);
		call.setString(1, senha);
		call.setInt(2, idUsuario);
		call.execute();

		call.close();
		con.close();
	}
	
	public static ArrayList<Usuario> GetUsuarioArrayList()
	{
		ArrayList<Usuario> usuarioList = new ArrayList<Usuario>(); 
		Connection con = Conexao.getConection();
		try {			
			String mysqlCall = "call spc_select_usuarios()";		
			CallableStatement call = (CallableStatement) con.prepareCall(mysqlCall);			
			ResultSet res = call.executeQuery();			
			
			while(res.next())
			{
				Usuario user = UsuarioDAO.setInstance(res);
				usuarioList.add(user);
			}
			
			call.close();
			con.close();
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return usuarioList;  
	}
	
	public static Usuario LoadObject(int id) throws SQLException 
	{
		Usuario usuario = new Usuario();
		Connection con = Conexao.getConection();
		String mysqlCall = "call spc_select_usuario_por_id(?)";
		CallableStatement call = (CallableStatement) con.prepareCall(mysqlCall);
		call.setInt(1, id);
		ResultSet res = call.executeQuery();
		
		if(res.next())
			usuario = UsuarioDAO.setInstance(res);
		
		call.close();		
		con.close();
		return usuario;
	}
	
	private static CallableStatement setObjectCallableStatement(Usuario user, String mysqlCall, Connection con ) throws SQLException
	{		
		CallableStatement prep = (CallableStatement) con.prepareCall(mysqlCall);
		prep.setString(1, user.getNome());
		prep.setString (2, user.getLogin());
		prep.setString (3, user.getSenha());
		prep.setInt (4, user.getAtivo());
		prep.setString (5, user.getEmail());		
		
		if(user.getIdUsuario() > 0)
			prep.setInt(6, user.getIdUsuario());
	
		return prep; 		
	}
	
	public static Usuario setInstance(ResultSet result) throws SQLException
	{
		Usuario user = new Usuario();
		user.setIdUsuario(result.getInt("id_usuario"));
		user.setNome(result.getString("nome"));
		user.setLogin(result.getString("login"));
		user.setSenha(result.getString("senha"));
		user.setEmail(result.getString("email"));
		user.setAtivo(result.getInt("ativo"));		
		return user; 
	}
	
	public static boolean ExisteUsuarioPorEmail(String email)
	{
		int quantidade = 0;
		try {
			Connection con = Conexao.getConection();		
			String mysqlCall = "call spc_select_qtd_usuario_por_email(?);";			
			CallableStatement call = (CallableStatement) con.prepareCall(mysqlCall);
			call.setString(1, email);
			ResultSet res = call.executeQuery();
			
			if(res.next())
				quantidade = res.getInt("quantidade");			
			
			call.close();
			con.close();		
			
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		return quantidade > 0;
	}	
	
}
